package com.ebelter.btcomlib.models.bluetooth.products.temperature;

import android.os.Handler;
import android.os.Looper;


import com.ebelter.btcomlib.models.bluetooth.products.temperature.bean.DateTime;
import com.ebelter.btcomlib.models.bluetooth.products.temperature.interfaces.I_T_MeasureCallback;
import com.ebelter.btcomlib.utils.BytesUtils;
import com.ebelter.btcomlib.utils.log.LogUtils;



/**
 * byte解析工具类
 */
public class TemperatureBytesAnalysisFatory {


//    时钟同问题：
//    每次开机，时钟将会不准确，这时联上app，app要首先发送同步时钟命令，不然，体温贴不会发送任何数据。如果同步完时钟，首先进入历史数据模式，如果没有历史数据，或者历史数据发送完，将会进入实时温度模式。
//    如果同步完时钟，中间断开了，只要没有关机，下一次再次联接，不需要同步时钟，自动会进入历史数据模式，传送完历史数据会自动进入实时温度模式。
//    所以只要关机了，再次开机就要同步时钟。如果同步完时钟，没有关机，断开再联接就不需要同步时钟。


    private static final String TAG="TemperatureBytesAnalysisFatory";

    private Handler myMainHandler;

    public TemperatureBytesAnalysisFatory() {
        this.myMainHandler = new Handler(Looper.getMainLooper());
    }


    private I_T_MeasureCallback mI_T_MeasureCallback;

    public void setmIMeasureResultCallback(I_T_MeasureCallback mI_T_MeasureCallback) {
        this.mI_T_MeasureCallback = mI_T_MeasureCallback;
    }



    //protected StringBuilder dataSb;

    public void resultAnalysis(byte[] data){

        LogUtils.i(TAG,BytesUtils.bytes2HexStr(data));
        if (!checkoutCode(data)){
            LogUtils.i(TAG,"----校验码---错误");
            return;
        }

        LogUtils.i(TAG,"--校验码--正确");


        if (data[0]==(byte) 0xb1&&data[1]==0&&data[9]==(byte) 0xb1){//表示实时钟未同频需要同频时钟
            LogUtils.i(TAG,"表示实时钟未同频需要同频时钟");

        }else if (data[0]==(byte) 0xb1&&data[1]!=0){//系统时间

            deviceTime(data);
        }else if (data[0] == (byte) 0xc4){
//            无历数据，表示历史数据发送完或者没有历史数据
//            C4:FF:FF:FF:FF:FF:FF:FF:FF:BC，
            noHistory();
        }else if (data[0] == (byte) 0xe1&&data[9]==(byte) 0xd9){

            clearAllHistoryDataFinish();
        }else if (data[0]==(byte) 0xa1){
            temperature(data);
        }







    }

    //实时温度
    private void temperature(byte[] data) {
        LogUtils.i(TAG,"接收到实时温度");
        final int te=get2ByteValue(data[7],data[8]);
        if (myMainHandler!=null){
            myMainHandler.post(new Runnable() {
                @Override
                public void run() {
                    if (mI_T_MeasureCallback!=null) mI_T_MeasureCallback.temperture(te);
                }
            });
        }
    }

    //清除完全部的历史数据
    private void clearAllHistoryDataFinish() {
        LogUtils.i(TAG,"清除完全部的历史数据");
        if (myMainHandler!=null){
            myMainHandler.post(new Runnable() {
                @Override
                public void run() {
                    if (mI_T_MeasureCallback!=null) mI_T_MeasureCallback.clearAllHistoryDataFinish();
                }
            });
        }
    }

    private void noHistory() {
        LogUtils.i(TAG,"没有历史数据指令");
        if (myMainHandler!=null){
            myMainHandler.post(new Runnable() {
                @Override
                public void run() {
                    if (mI_T_MeasureCallback!=null) mI_T_MeasureCallback.noHistoryData();
                }
            });
        }
    }

    private void deviceTime(byte[] data) {
        LogUtils.i(TAG,"收到设备时钟指令");

        int year = get2ByteValue(data[1],data[2]);
        int month=data[3];
        int day=data[4];
        int hour=data[5];
        int min=data[6];
        int second=data[7];

        final DateTime dateTime=new DateTime();
        dateTime.year=year;
        dateTime.month=month;
        dateTime.day=day;
        dateTime.hour=hour;
        dateTime.min=min;
        dateTime.second=second;

        if (myMainHandler!=null){
            myMainHandler.post(new Runnable() {
                @Override
                public void run() {
                    if (mI_T_MeasureCallback!=null) mI_T_MeasureCallback.deviceTime(dateTime);
                }
            });
        }









    }


    //检验校验码是否正确
    private boolean checkoutCode(byte[] data){
        if (data==null||data.length!=10){
            return false;
        }

        int total = 0;
        for (int i=0;i<9;i++){
            total=total+data[i];//计算0-8的和
        }
        return total==data[9];
    }



    /**
     * 高8位低8位拼接
     * @param high 高8位字节
     * @param low  低8位字节
     */
    private int get2ByteValue(byte high, byte low) {
        return ((high & 0xff) << 8) | (low & 0xff);
    }



}
